#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <cassert>
#include <vector>
using std::cin;
using std::cout;
using std::endl;

// void *pthread_handler(void *arr)
// {
//     std::string s = static_cast<const char *>(arr);
//     while(1)
//     {
//         cout << "我是新线程!" << s << getpid() << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t pid;
//     int n = pthread_create(&pid, nullptr, pthread_handler, (void *)"I am id : ");
//     assert(n == 0);
//     (void)n;
//     while(1)
//     {
//         cout << "我是主线程!" << endl;
//         sleep(1);
//     }
//     return 0;
// }



pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; // 这里就将条件变量和锁定义为全局的，后面会使用init和destroy函数
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;   // 条件变量本身不是互斥的，所以要配和互斥锁来使用

int tickets = 1000;

void *start_routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    while (1)
    {
        pthread_mutex_lock(&lock);
        // if (tickets > 0)//判断暂时省略
        pthread_cond_wait(&cond, &lock); // 这里为什么要有lock锁，我们后面说
        cout << name << "->" << tickets << endl;
        cout.flush();
        tickets--;
        pthread_mutex_unlock(&lock);
    }
}
int main()
{
    // // 通过条件变量控制线程的执行
    // pthread_t t1, t2;
    // pthread_create(&t1, nullptr, start_routine, (void *)"thread 1");
    // pthread_create(&t2, nullptr, start_routine, (void *)"thread 2");
    std::vector<pthread_t> ret;
    for(int i=0;i<5;++i)
    {
        ret.resize(5);
        // char buffer[1024];
        char* buffer = new char[1024];
        snprintf(buffer,1024,"I am pthread : %d",i+1);
        pthread_create(&ret[i],nullptr,start_routine,buffer);
    }
    while (1)
    {
        sleep(1);
        // pthread_cond_signal(&cond); // 一次唤醒一个线程
        pthread_cond_broadcast(&cond); // 一次唤醒一批线程
        cout << "main thread wakeup one thread..." << endl;
        cout.flush();

    }
    for(int i=0;i<5;++i)
    {
        pthread_join(ret[i],nullptr);
    }

    return 0;
}
